package 进阶阶段;

import java.util.*;

public class demo06Collection根接口所有单列集合的父接口 {
    public static void main(String[] args) {
        //集合：集合是java中提供的一种容器，可以用来存储多个数据

        //集合和数组既然都是容器，他们的区别是什么
        //1. 数组的长度是固定的，集合的长度是可变的
        //2. 数组中存储的是同一类型的元素，可以存储基本数据类型的值，也可以用来存储对象(引用数据类型)
        //3. 集合存储的都是对象，而且对象的类型可以不一致。一般开发中，当对象多的时候，推荐使用集合进行存储
        int[] arr1 = {123};
        Object[] arr2 = {1 , 2 , 23.4 , "abc" , new Integer(1)};//数组可以存储元素，也可以存储对象
        ArrayList<Integer> arrayList = new ArrayList<>();
        arrayList.add(1);
        System.out.println(arrayList);//[1]，toString()不写系统写
        System.out.println(arrayList.toString());//[1]

        //集合按照其存储结构可以分为两大类，分别是单列集合Collection和双列集合Map
        //Collection：单列集合类有两个重要的子接口，分别是List和Set

        //Collection是所有单列集合的父接口,Collection中定义了单列集合(List和Set)通用的一些方法,如下
        //add();    把给定的对象添加到当前集合中//增
        //remove(); 把给定的对象在当前集合中删除//删一个
        //clear();  清空集合中所有的元素。//删除所有
        //toArray();把集合中的元素，存储到数组中。//改,变成数组,转换成数组
        //contains();判断当前集合中是否包含给定的对象。//查,是否包含元素,针对的是一个
        //isEmpty();判断当前集合是否为空。//查,是否没有元素,针对的是所有情况
        //size();   返回集合中元素的个数。//查,元素的个数,针对的也是所有情况

        //List的特点是元素有序、元素可重复,有索引
        //List接口的主要实现类有ArrayList和LinkedList
            //1. 它是一个元素存取有序的集合。例如，存元素的顺序是11、22、33。那么集合中，元素的存储就是按照11、22、33的顺序完成的）。
            //2. 它是一个带有索引的集合，通过索引就可以精确的操作集合中的元素（与数组的索引是一个道理）。get(0)
            //3. 集合中可以有重复的元素
        ArrayList<String> list = new ArrayList<>();
        list.add("list第一个元素");
        list.add("list第二个元素");
        System.out.println(list);

        //add(int index, E element): 插入,添加,将指定的元素，添加到该集合中的指定位置上。可以在头部或者尾部插入,索引不报异常,其他都报索引越界异常!!!//增,插入增加
        //remove(int index): 移除列表中指定位置的元素, 返回的是被移除的元素。//删,间接删
        //set(int index, E element):用指定元素替换集合中指定位置的元素,返回更新前的元素。//改,设置
        //get(int index):返回集合中指定位置的元素。//查,得到元素,根据索引得到元素

        //Set的特点是元素无序，而且不可重复,无索引
        //Set接口的主要实现类有HashSet和TreeSet
            //HashSet是根据对象的哈希值,来确定元素在集合中的存储位置，因此具有良好的存取和查找性能
        HashSet<String> set = new HashSet<>();
        set.add("set第一个元素");
        set.add("set第二个元素");
        set.add("set第三个元素");
        System.out.println(set);//HashSet是无序的

        //HashSet也是单列集合，就可以用增强for循环，得到集合里面的每一个元素
        for (String a : set) {
            System.out.println(a);
        }

        //LinkedHashSet是有序的Set接口实现类
        LinkedHashSet<Study> linkedHashMap = new LinkedHashSet();
        Study study = new Study("linkedHashMap第一个元素" , 1);
        linkedHashMap.add(study);
        linkedHashMap.add(new Study("linkedHashMap第二个元素" , 2));
        linkedHashMap.add(new Study("linkedHashMap第三个元素" , 3));

        //LinkedHashSet也是单列集合，就可以用增强for循环，得到集合里面的每一个元素
        for (Study b : linkedHashMap) {
            System.out.println(b.getName() + b.getAge());
        }

        //HashSet和HashMap的区别:
        //(1)HashSet实现了Set接口, 仅存储对象; HashMap实现了 Map接口, 存储的是键值对.
        //(2)HashSet底层其实是用HashMap实现存储的, HashSet封装了一系列HashMap的方法. 依靠HashMap来存储元素值,(利用hashMap的key键进行存储), 而value值默
            //认为Object对象. 所以HashSet也不允许出现重复值, 判断标准和HashMap判断标准相同, 两个元素的hashCode相等并且通过equals()方法返回true.
    }

}

class Study{
    private String name;
    private Integer age;

    public Study(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
};
